


<!doctype html>
<html lang="en" class="no-js">
  <head>
    
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width,initial-scale=1">
      
      
        <link rel="canonical" href="https://daptin.github.io/daptin/state/machines/">
      
      
      <link rel="shortcut icon" href="../../images/theme-favicon.png">
      <meta name="generator" content="mkdocs-1.1.2, mkdocs-material-5.5.3">
    
    
      
        <title>State tracking - Daptin</title>
      
    
    
      <link rel="stylesheet" href="../../assets/stylesheets/main.947af8d5.min.css">
      
      
    
    
    
      
        <link href="https://fonts.gstatic.com" rel="preconnect" crossorigin>
        <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700%7CRoboto+Mono&display=fallback">
        <style>body,input{font-family:"Roboto",-apple-system,BlinkMacSystemFont,Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono",SFMono-Regular,Consolas,Menlo,monospace}</style>
      
    
    
    
      <link rel="stylesheet" href="../../css/theme_extra.css">
    
    
      
        
<script>window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)},ga.l=+new Date,ga("create","UA-114227400-1","docs.dapt.in"),ga("set","anonymizeIp",!0),ga("send","pageview"),document.addEventListener("DOMContentLoaded",function(){document.forms.search&&document.forms.search.query.addEventListener("blur",function(){if(this.value){var e=document.location.pathname;ga("send","pageview",e+"?q="+this.value)}})}),document.addEventListener("DOMContentSwitch",function(){ga("send","pageview",document.location.pathname)})</script>
<script async src="https://www.google-analytics.com/analytics.js"></script>
      
    
    
  </head>
  
  
    <body dir="ltr">
  
    
    <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
    <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
    <label class="md-overlay" for="__drawer"></label>
    <div data-md-component="skip">
      
        
        <a href="#state-tracking" class="md-skip">
          Skip to content
        </a>
      
    </div>
    <div data-md-component="announce">
      
    </div>
    
      <header class="md-header" data-md-component="header">
  <nav class="md-header-nav md-grid" aria-label="Header">
    <a href="https://daptin.github.io/daptin/" title="Daptin" class="md-header-nav__button md-logo" aria-label="Daptin">
      
  <img src="../../images/theme-logo.png" alt="logo">

    </a>
    <label class="md-header-nav__button md-icon" for="__drawer">
      <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2z"/></svg>
    </label>
    <div class="md-header-nav__title" data-md-component="header-title">
      
        <div class="md-header-nav__ellipsis">
          <span class="md-header-nav__topic md-ellipsis">
            Daptin
          </span>
          <span class="md-header-nav__topic md-ellipsis">
            
              State tracking
            
          </span>
        </div>
      
    </div>
    
      <label class="md-header-nav__button md-icon" for="__search">
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0116 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 019.5 16 6.5 6.5 0 013 9.5 6.5 6.5 0 019.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"/></svg>
      </label>
      
<div class="md-search" data-md-component="search" role="dialog">
  <label class="md-search__overlay" for="__search"></label>
  <div class="md-search__inner" role="search">
    <form class="md-search__form" name="search">
      <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" data-md-state="active">
      <label class="md-search__icon md-icon" for="__search">
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0116 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 019.5 16 6.5 6.5 0 013 9.5 6.5 6.5 0 019.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"/></svg>
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
      </label>
      <button type="reset" class="md-search__icon md-icon" aria-label="Clear" data-md-component="search-reset" tabindex="-1">
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z"/></svg>
      </button>
    </form>
    <div class="md-search__output">
      <div class="md-search__scrollwrap" data-md-scrollfix>
        <div class="md-search-result" data-md-component="search-result">
          <div class="md-search-result__meta">
            Initializing search
          </div>
          <ol class="md-search-result__list"></ol>
        </div>
      </div>
    </div>
  </div>
</div>
    
    
  </nav>
</header>
    
    <div class="md-container" data-md-component="container">
      
        
      
      
        
      
      <main class="md-main" data-md-component="main">
        <div class="md-main__inner md-grid">
          
            
              <div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
                <div class="md-sidebar__scrollwrap">
                  <div class="md-sidebar__inner">
                    <nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
  <label class="md-nav__title" for="__drawer">
    <a href="https://daptin.github.io/daptin/" title="Daptin" class="md-nav__button md-logo" aria-label="Daptin">
      
  <img src="../../images/theme-logo.png" alt="logo">

    </a>
    Daptin
  </label>
  
  <ul class="md-nav__list" data-md-scrollfix>
    
      
      
      


  <li class="md-nav__item md-nav__item--nested">
    
      <input class="md-nav__toggle md-toggle" data-md-toggle="nav-1" type="checkbox" id="nav-1">
    
    <label class="md-nav__link" for="nav-1">
      Getting started
      <span class="md-nav__icon md-icon">
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8.59 16.58L13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.42z"/></svg>
      </span>
    </label>
    <nav class="md-nav" aria-label="Getting started" data-md-level="1">
      <label class="md-nav__title" for="nav-1">
        <span class="md-nav__icon md-icon">
          <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
        </span>
        Getting started
      </label>
      <ul class="md-nav__list" data-md-scrollfix>
        
        
          
          
          


  <li class="md-nav__item">
    <a href="../.." title="Daptin" class="md-nav__link">
      Daptin
    </a>
  </li>

        
          
          
          


  <li class="md-nav__item">
    <a href="../../setting-up/installation/" title="Installation" class="md-nav__link">
      Installation
    </a>
  </li>

        
          
          
          


  <li class="md-nav__item">
    <a href="../../setting-up/settingup/" title="Getting started" class="md-nav__link">
      Getting started
    </a>
  </li>

        
          
          
          


  <li class="md-nav__item">
    <a href="../../setting-up/access/" title="User management" class="md-nav__link">
      User management
    </a>
  </li>

        
          
          
          


  <li class="md-nav__item">
    <a href="../../setting-up/data_modeling/" title="Data model" class="md-nav__link">
      Data model
    </a>
  </li>

        
      </ul>
    </nav>
  </li>

    
      
      
      


  <li class="md-nav__item md-nav__item--nested">
    
      <input class="md-nav__toggle md-toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2">
    
    <label class="md-nav__link" for="nav-2">
      JSON API reference
      <span class="md-nav__icon md-icon">
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8.59 16.58L13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.42z"/></svg>
      </span>
    </label>
    <nav class="md-nav" aria-label="JSON API reference" data-md-level="1">
      <label class="md-nav__title" for="nav-2">
        <span class="md-nav__icon md-icon">
          <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
        </span>
        JSON API reference
      </label>
      <ul class="md-nav__list" data-md-scrollfix>
        
        
          
          
          


  <li class="md-nav__item">
    <a href="../../apis/crud/#crud-api" title="CRUD API" class="md-nav__link">
      CRUD API
    </a>
  </li>

        
          
          
          


  <li class="md-nav__item">
    <a href="../../apis/crud/#action-api" title="Action API" class="md-nav__link">
      Action API
    </a>
  </li>

        
          
          
          


  <li class="md-nav__item">
    <a href="../../apis/crud/#relation-apis" title="Relation API" class="md-nav__link">
      Relation API
    </a>
  </li>

        
          
          
          


  <li class="md-nav__item">
    <a href="../../apis/crud/#aggregate-api" title="Aggregation API" class="md-nav__link">
      Aggregation API
    </a>
  </li>

        
          
          
          


  <li class="md-nav__item">
    <a href="../../apis/crud/#state-machine-apis" title="State machine API" class="md-nav__link">
      State machine API
    </a>
  </li>

        
          
          
          


  <li class="md-nav__item">
    <a href="../../apis/crud/#metadata-api" title="Metadata API" class="md-nav__link">
      Metadata API
    </a>
  </li>

        
      </ul>
    </nav>
  </li>

    
      
      
      


  <li class="md-nav__item md-nav__item--nested">
    
      <input class="md-nav__toggle md-toggle" data-md-toggle="nav-3" type="checkbox" id="nav-3">
    
    <label class="md-nav__link" for="nav-3">
      Actions
      <span class="md-nav__icon md-icon">
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8.59 16.58L13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.42z"/></svg>
      </span>
    </label>
    <nav class="md-nav" aria-label="Actions" data-md-level="1">
      <label class="md-nav__title" for="nav-3">
        <span class="md-nav__icon md-icon">
          <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
        </span>
        Actions
      </label>
      <ul class="md-nav__list" data-md-scrollfix>
        
        
          
          
          


  <li class="md-nav__item">
    <a href="../../actions/actions/" title="What are actions" class="md-nav__link">
      What are actions
    </a>
  </li>

        
          
          
          


  <li class="md-nav__item">
    <a href="../../actions/default_actions/" title="Actions list" class="md-nav__link">
      Actions list
    </a>
  </li>

        
          
          
          


  <li class="md-nav__item">
    <a href="../../actions/examples/" title="Examples" class="md-nav__link">
      Examples
    </a>
  </li>

        
      </ul>
    </nav>
  </li>

    
      
      
      

  


  <li class="md-nav__item md-nav__item--active md-nav__item--nested">
    
      <input class="md-nav__toggle md-toggle" data-md-toggle="nav-4" type="checkbox" id="nav-4" checked>
    
    <label class="md-nav__link" for="nav-4">
      Features
      <span class="md-nav__icon md-icon">
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8.59 16.58L13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.42z"/></svg>
      </span>
    </label>
    <nav class="md-nav" aria-label="Features" data-md-level="1">
      <label class="md-nav__title" for="nav-4">
        <span class="md-nav__icon md-icon">
          <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
        </span>
        Features
      </label>
      <ul class="md-nav__list" data-md-scrollfix>
        
        
          
          
          


  <li class="md-nav__item">
    <a href="../../features/enable-graphql/" title="GraphQL" class="md-nav__link">
      GraphQL
    </a>
  </li>

        
          
          
          


  <li class="md-nav__item">
    <a href="../../features/enable-data-auditing/" title="Data Auditing" class="md-nav__link">
      Data Auditing
    </a>
  </li>

        
          
          
          


  <li class="md-nav__item">
    <a href="../../features/enable-multilingual-table/" title="Multilingual Table" class="md-nav__link">
      Multilingual Table
    </a>
  </li>

        
          
          
          


  <li class="md-nav__item">
    <a href="../../features/enable-smtp-imap/" title="SMTP/IMPS server" class="md-nav__link">
      SMTP/IMPS server
    </a>
  </li>

        
          
          
          


  <li class="md-nav__item">
    <a href="../../features/enable-logs/" title="Logs" class="md-nav__link">
      Logs
    </a>
  </li>

        
          
          
          

  


  <li class="md-nav__item md-nav__item--active">
    
    <input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
    
      
    
    
      <label class="md-nav__link md-nav__link--active" for="__toc">
        State tracking
        <span class="md-nav__icon md-icon">
          <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 9h14V7H3v2m0 4h14v-2H3v2m0 4h14v-2H3v2m16 0h2v-2h-2v2m0-10v2h2V7h-2m0 6h2v-2h-2v2z"/></svg>
        </span>
      </label>
    
    <a href="./" title="State tracking" class="md-nav__link md-nav__link--active">
      State tracking
    </a>
    
      
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
  
  
    
  
  
    <label class="md-nav__title" for="__toc">
      <span class="md-nav__icon md-icon">
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
      </span>
      Table of contents
    </label>
    <ul class="md-nav__list" data-md-scrollfix>
      
        <li class="md-nav__item">
  <a href="#defining-a-state-machine" class="md-nav__link">
    Defining a state machine
  </a>
  
</li>
      
        <li class="md-nav__item">
  <a href="#state-machine" class="md-nav__link">
    State machine
  </a>
  
</li>
      
        <li class="md-nav__item">
  <a href="#rest-api" class="md-nav__link">
    REST API
  </a>
  
    <nav class="md-nav" aria-label="REST API">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#start-tracking-an-object-by-state-machine-reference-id" class="md-nav__link">
    Start tracking an object by state machine reference id
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#trigger-an-event-by-name-in-the-state-of-an-object" class="md-nav__link">
    Trigger an event by name in the state of an object
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
      
        <li class="md-nav__item">
  <a href="#enabling-state-tracking-for-entity" class="md-nav__link">
    Enabling state tracking for entity
  </a>
  
</li>
      
    </ul>
  
</nav>
    
  </li>

        
          
          
          


  <li class="md-nav__item">
    <a href="../../extend/oauth_connection/" title="OAuth Connections" class="md-nav__link">
      OAuth Connections
    </a>
  </li>

        
          
          
          


  <li class="md-nav__item">
    <a href="../../extend/oauth_token/" title="OAuth Tokens" class="md-nav__link">
      OAuth Tokens
    </a>
  </li>

        
          
          
          


  <li class="md-nav__item">
    <a href="../../integrations/overview/" title="Integrations Overview" class="md-nav__link">
      Integrations Overview
    </a>
  </li>

        
          
          
          


  <li class="md-nav__item">
    <a href="../../cloudstore/cloudstore/" title="Cloud store" class="md-nav__link">
      Cloud store
    </a>
  </li>

        
          
          
          


  <li class="md-nav__item">
    <a href="../../cloudstore/assetcolumns/" title="Cloud store backed asset columns" class="md-nav__link">
      Cloud store backed asset columns
    </a>
  </li>

        
          
          
          


  <li class="md-nav__item md-nav__item--nested">
    
      <input class="md-nav__toggle md-toggle" data-md-toggle="nav-4-12" type="checkbox" id="nav-4-12">
    
    <label class="md-nav__link" for="nav-4-12">
      Sub-sites
      <span class="md-nav__icon md-icon">
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8.59 16.58L13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.42z"/></svg>
      </span>
    </label>
    <nav class="md-nav" aria-label="Sub-sites" data-md-level="2">
      <label class="md-nav__title" for="nav-4-12">
        <span class="md-nav__icon md-icon">
          <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
        </span>
        Sub-sites
      </label>
      <ul class="md-nav__list" data-md-scrollfix>
        
        
          
          
          


  <li class="md-nav__item">
    <a href="../../subsite/subsite/" title="Creating a subsite" class="md-nav__link">
      Creating a subsite
    </a>
  </li>

        
          
          
          


  <li class="md-nav__item">
    <a href="../../subsite/grapes/" title="Live editing a subsite" class="md-nav__link">
      Live editing a subsite
    </a>
  </li>

        
          
          
          


  <li class="md-nav__item">
    <a href="../../subsite/basic_auth/" title="Basic Authentication" class="md-nav__link">
      Basic Authentication
    </a>
  </li>

        
      </ul>
    </nav>
  </li>

        
      </ul>
    </nav>
  </li>

    
      
      
      


  <li class="md-nav__item md-nav__item--nested">
    
      <input class="md-nav__toggle md-toggle" data-md-toggle="nav-5" type="checkbox" id="nav-5">
    
    <label class="md-nav__link" for="nav-5">
      Reference Documents
      <span class="md-nav__icon md-icon">
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8.59 16.58L13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.42z"/></svg>
      </span>
    </label>
    <nav class="md-nav" aria-label="Reference Documents" data-md-level="1">
      <label class="md-nav__title" for="nav-5">
        <span class="md-nav__icon md-icon">
          <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
        </span>
        Reference Documents
      </label>
      <ul class="md-nav__list" data-md-scrollfix>
        
        
          
          
          


  <li class="md-nav__item">
    <a href="../../data-modeling/data_storage/" title="Data store format" class="md-nav__link">
      Data store format
    </a>
  </li>

        
          
          
          


  <li class="md-nav__item">
    <a href="../../extend/data_exchange/" title="Data exchange and sync" class="md-nav__link">
      Data exchange and sync
    </a>
  </li>

        
          
          
          


  <li class="md-nav__item">
    <a href="../../streams/streams/" title="Data streams" class="md-nav__link">
      Data streams
    </a>
  </li>

        
          
          
          


  <li class="md-nav__item">
    <a href="../../setting-up/enabling-features/" title="Enable/Disabling features" class="md-nav__link">
      Enable/Disabling features
    </a>
  </li>

        
      </ul>
    </nav>
  </li>

    
  </ul>
</nav>
                  </div>
                </div>
              </div>
            
            
              <div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
                <div class="md-sidebar__scrollwrap">
                  <div class="md-sidebar__inner">
                    
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
  
  
    
  
  
    <label class="md-nav__title" for="__toc">
      <span class="md-nav__icon md-icon">
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
      </span>
      Table of contents
    </label>
    <ul class="md-nav__list" data-md-scrollfix>
      
        <li class="md-nav__item">
  <a href="#defining-a-state-machine" class="md-nav__link">
    Defining a state machine
  </a>
  
</li>
      
        <li class="md-nav__item">
  <a href="#state-machine" class="md-nav__link">
    State machine
  </a>
  
</li>
      
        <li class="md-nav__item">
  <a href="#rest-api" class="md-nav__link">
    REST API
  </a>
  
    <nav class="md-nav" aria-label="REST API">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#start-tracking-an-object-by-state-machine-reference-id" class="md-nav__link">
    Start tracking an object by state machine reference id
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#trigger-an-event-by-name-in-the-state-of-an-object" class="md-nav__link">
    Trigger an event by name in the state of an object
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
      
        <li class="md-nav__item">
  <a href="#enabling-state-tracking-for-entity" class="md-nav__link">
    Enabling state tracking for entity
  </a>
  
</li>
      
    </ul>
  
</nav>
                  </div>
                </div>
              </div>
            
          
          <div class="md-content">
            <article class="md-content__inner md-typeset">
              
                
                
                  
                
                
                <h1 id="state-tracking">State tracking<a class="headerlink" href="#state-tracking" title="Permanent link">Link</a></h1>
<p>State of an object can help you tracing any sort of progress while making sure you maintain the consistence of the state. For eg, you might want to track the status of a "blog post" in terms of "draft"/"edited"/"published" which pre-defined endpoints defining the flow of states.</p>
<p>Tracking the status of things is one of the most common operation in most business flows. Daptin has a native support for state tracking and allows a lot of convienent features.</p>
<h2 id="defining-a-state-machine">Defining a state machine<a class="headerlink" href="#defining-a-state-machine" title="Permanent link">Link</a></h2>
<p>Define a state machine in YAML or JSON as follows:</p>
<p>!!! example"State machine description YAML"
    <div class="highlight"><pre><span></span><code><span class="nt">StateMachineDescriptions</span><span class="p">:</span>
<span class="p p-Indicator">-</span> <span class="nt">Name</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">task_status</span>
  <span class="nt">Label</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">Task Status</span>
  <span class="nt">InitialState</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">to_be_done</span>
  <span class="nt">Events</span><span class="p">:</span>
  <span class="p p-Indicator">-</span> <span class="nt">Name</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">start</span>
    <span class="nt">Label</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">Start</span>
    <span class="nt">Src</span><span class="p">:</span>
    <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">to_be_done</span>
    <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">delayed</span>
    <span class="nt">Dst</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">started</span>
  <span class="p p-Indicator">-</span> <span class="nt">Name</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">delayed</span>
    <span class="nt">Label</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">Unable to pick up</span>
    <span class="nt">Src</span><span class="p">:</span>
    <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">to_be_done</span>
    <span class="nt">Dst</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">delayed</span>
  <span class="p p-Indicator">-</span> <span class="nt">Name</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">ongoing</span>
    <span class="nt">Label</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">Record progress</span>
    <span class="nt">Src</span><span class="p">:</span>
    <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">started</span>
    <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">ongoing</span>
    <span class="nt">Dst</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">ongoing</span>
  <span class="p p-Indicator">-</span> <span class="nt">Name</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">interrupted</span>
    <span class="nt">Label</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">Interrupted</span>
    <span class="nt">Src</span><span class="p">:</span>
    <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">started</span>
    <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">ongoing</span>
    <span class="nt">Dst</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">interrupted</span>
  <span class="p p-Indicator">-</span> <span class="nt">Name</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">resume</span>
    <span class="nt">Label</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">Resume from interruption</span>
    <span class="nt">Src</span><span class="p">:</span>
    <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">interrupted</span>
    <span class="nt">Dst</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">ongoing</span>
  <span class="p p-Indicator">-</span> <span class="nt">Name</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">completed</span>
    <span class="nt">Label</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">Mark as completed</span>
    <span class="nt">Src</span><span class="p">:</span>
    <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">ongoing</span>
    <span class="p p-Indicator">-</span> <span class="l l-Scalar l-Scalar-Plain">started</span>
    <span class="nt">Dst</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">completed</span>
</code></pre></div></p>
<p>Using state machine descriptions with daptin expose couple of super useful apis to manage state based data.</p>
<p>Enabling <code>task_status</code> state machine on <code>todo</code> entity will expose the following APIs</p>
<div class="highlight"><pre><span></span><code>POST /track/start/:stateMachineId <span class="o">{</span><span class="s2">&quot;typeName&quot;</span>: <span class="s2">&quot;todo&quot;</span>, <span class="s2">&quot;referenceId&quot;</span>: <span class="s2">&quot;objectId&quot;</span><span class="o">}</span> <span class="c1"># Start tracking a particular object by id</span>
</code></pre></div>

<p>This returns a state machine id.</p>
<div class="highlight"><pre><span></span><code>POST /track/event/:typename/:objectStateMachineId/:eventName <span class="o">{}</span> <span class="c1"># Trigger event on current state</span>
</code></pre></div>

<p>This either moves the <code>object state</code> to next state, or fails on invalid event name.</p>
<h2 id="state-machine">State machine<a class="headerlink" href="#state-machine" title="Permanent link">Link</a></h2>
<p>A state machine is a description of "states" which the object can be in, and list of all valid transitions from one state to another. Let us begin with an example:</p>
<p>The following JSON defines a state machine which has (a hypothetical state machine for tracking todos):</p>
<ul>
<li>Initial state: to_be_done</li>
<li>List of valid states: to_be_done, delayed, started, ongoing, interrupted, completed</li>
<li>List of valid transitions, giving name to each event</li>
</ul>
<div class="highlight"><pre><span></span><code>        <span class="p">{</span>
        <span class="nt">&quot;Name&quot;</span><span class="p">:</span> <span class="s2">&quot;task_status&quot;</span><span class="p">,</span>
        <span class="nt">&quot;Label&quot;</span><span class="p">:</span> <span class="s2">&quot;Task Status&quot;</span><span class="p">,</span>
        <span class="nt">&quot;InitialState&quot;</span><span class="p">:</span> <span class="s2">&quot;to_be_done&quot;</span><span class="p">,</span>
        <span class="nt">&quot;Events&quot;</span><span class="p">:</span> <span class="p">[{</span>
                <span class="nt">&quot;Name&quot;</span><span class="p">:</span> <span class="s2">&quot;start&quot;</span><span class="p">,</span>
                <span class="nt">&quot;Label&quot;</span><span class="p">:</span> <span class="s2">&quot;Start&quot;</span><span class="p">,</span>
                <span class="nt">&quot;Src&quot;</span><span class="p">:</span> <span class="p">[</span>
                    <span class="s2">&quot;to_be_done&quot;</span><span class="p">,</span>
                    <span class="s2">&quot;delayed&quot;</span>
                <span class="p">],</span>
                <span class="nt">&quot;Dst&quot;</span><span class="p">:</span> <span class="s2">&quot;started&quot;</span>
            <span class="p">},</span>
            <span class="p">{</span>
                <span class="nt">&quot;Name&quot;</span><span class="p">:</span> <span class="s2">&quot;delayed&quot;</span><span class="p">,</span>
                <span class="nt">&quot;Label&quot;</span><span class="p">:</span> <span class="s2">&quot;Unable to pick up&quot;</span><span class="p">,</span>
                <span class="nt">&quot;Src&quot;</span><span class="p">:</span> <span class="p">[</span>
                    <span class="s2">&quot;to_be_done&quot;</span>
                <span class="p">],</span>
                <span class="nt">&quot;Dst&quot;</span><span class="p">:</span> <span class="s2">&quot;delayed&quot;</span>
            <span class="p">},</span>
            <span class="p">{</span>
                <span class="nt">&quot;Name&quot;</span><span class="p">:</span> <span class="s2">&quot;ongoing&quot;</span><span class="p">,</span>
                <span class="nt">&quot;Label&quot;</span><span class="p">:</span> <span class="s2">&quot;Record progress&quot;</span><span class="p">,</span>
                <span class="nt">&quot;Src&quot;</span><span class="p">:</span> <span class="p">[</span>
                    <span class="s2">&quot;started&quot;</span><span class="p">,</span>
                    <span class="s2">&quot;ongoing&quot;</span>
                <span class="p">],</span>
                <span class="nt">&quot;Dst&quot;</span><span class="p">:</span> <span class="s2">&quot;ongoing&quot;</span>
            <span class="p">},</span>
            <span class="p">{</span>
                <span class="nt">&quot;Name&quot;</span><span class="p">:</span> <span class="s2">&quot;interrupted&quot;</span><span class="p">,</span>
                <span class="nt">&quot;Label&quot;</span><span class="p">:</span> <span class="s2">&quot;Interrupted&quot;</span><span class="p">,</span>
                <span class="nt">&quot;Src&quot;</span><span class="p">:</span> <span class="p">[</span>
                    <span class="s2">&quot;started&quot;</span><span class="p">,</span>
                    <span class="s2">&quot;ongoing&quot;</span>
                <span class="p">],</span>
                <span class="nt">&quot;Dst&quot;</span><span class="p">:</span> <span class="s2">&quot;interrupted&quot;</span>
            <span class="p">},</span>
            <span class="p">{</span>
                <span class="nt">&quot;Name&quot;</span><span class="p">:</span> <span class="s2">&quot;resume&quot;</span><span class="p">,</span>
                <span class="nt">&quot;Label&quot;</span><span class="p">:</span> <span class="s2">&quot;Resume from interruption&quot;</span><span class="p">,</span>
                <span class="nt">&quot;Src&quot;</span><span class="p">:</span> <span class="p">[</span>
                    <span class="s2">&quot;interrupted&quot;</span>
                <span class="p">],</span>
                <span class="nt">&quot;Dst&quot;</span><span class="p">:</span> <span class="s2">&quot;ongoing&quot;</span>
            <span class="p">},</span>
            <span class="p">{</span>
                <span class="nt">&quot;Name&quot;</span><span class="p">:</span> <span class="s2">&quot;completed&quot;</span><span class="p">,</span>
                <span class="nt">&quot;Label&quot;</span><span class="p">:</span> <span class="s2">&quot;Mark as completed&quot;</span><span class="p">,</span>
                <span class="nt">&quot;Src&quot;</span><span class="p">:</span> <span class="p">[</span>
                    <span class="s2">&quot;ongoing&quot;</span><span class="p">,</span>
                    <span class="s2">&quot;started&quot;</span>
                <span class="p">],</span>
                <span class="nt">&quot;Dst&quot;</span><span class="p">:</span> <span class="s2">&quot;completed&quot;</span>
            <span class="p">}</span>
        <span class="p">]</span>
    <span class="p">}</span>
</code></pre></div>

<p>State machines can be uploaded to Daptin just like entities and actions. A JSON/YAML file with a <code>StateMachineDescriptions</code> top level key can contain an array of state machine descriptions.</p>
<h2 id="rest-api">REST API<a class="headerlink" href="#rest-api" title="Permanent link">Link</a></h2>
<h3 id="start-tracking-an-object-by-state-machine-reference-id">Start tracking an object by state machine reference id<a class="headerlink" href="#start-tracking-an-object-by-state-machine-reference-id" title="Permanent link">Link</a></h3>
<p>Request
<div class="highlight"><pre><span></span><code>    POST  /track/start/:stateMachineId
    {&quot;typeName&quot;: &lt;entityTypeName&gt;, &quot;referenceId&quot;: &lt;ReferenceIdOfTheObject&gt; }
</code></pre></div></p>
<p>Response
<div class="highlight"><pre><span></span><code>        &quot;current_state&quot;: &lt;InitialStateOfTheStateMachine&gt;
        &quot;&lt;typename&gt;_smd&quot;: &lt;ObjectStateInstanceReferenceId&gt;
        &quot;is_state_of_&lt;typename&gt;&quot; = &lt;ObjectInstanceId&gt;
        &quot;permission&quot;: &lt;AuthPermission&gt;
</code></pre></div></p>
<h3 id="trigger-an-event-by-name-in-the-state-of-an-object">Trigger an event by name in the state of an object<a class="headerlink" href="#trigger-an-event-by-name-in-the-state-of-an-object" title="Permanent link">Link</a></h3>
<p><div class="highlight"><pre><span></span><code>    POST  /track/event/:typename/:ObjectStateInstanceReferenceId/:eventName
</code></pre></div>
Response
<div class="highlight"><pre><span></span><code>        &quot;current_state&quot;: &lt;NewStateAfterEvent&gt;
        &quot;&lt;typename&gt;_smd&quot;: &lt;ObjectStateInstanceReferenceId&gt;
        &quot;is_state_of_&lt;typename&gt;&quot; = &lt;ObjectInstanceId&gt;
</code></pre></div></p>
<h2 id="enabling-state-tracking-for-entity">Enabling state tracking for entity<a class="headerlink" href="#enabling-state-tracking-for-entity" title="Permanent link">Link</a></h2>
<p>Begin with marking an entity as trackable. To do this,</p>
<ul>
<li>
<p>go to the world tables page and edit the an entity</p>
</li>
<li>
<p>Check the "Is state tracking enabled" checkbox</p>
</li>
</ul>
<p>This "is_state_tracking_enabled" options tells daptin to create the associated state table for the entity. Even though we have not yet specified which state machines are available for this entity.</p>
<p>To make a state machine available for an entity, go to the "SMD" tab of this entity on the same page and add the state machine by searching it by name and adding it.</p>
<p>It would not make a lot of sense if the above state machine was allowed for all type of entities.</p>
                
              
              
                


  <h2 id="__comments">Comments</h2>
  <div id="disqus_thread"></div>
  <script>var disqus_config=function(){this.page.url="https://daptin.github.io/daptin/state/machines/",this.page.identifier="state/machines/"};!function(){var e=document,i=e.createElement("script");i.src="//daptin-documentation.disqus.com/embed.js",i.setAttribute("data-timestamp",+new Date),(e.head||e.body).appendChild(i)}()</script>

              
            </article>
          </div>
        </div>
      </main>
      
        
<footer class="md-footer">
  
    <div class="md-footer-nav">
      <nav class="md-footer-nav__inner md-grid" aria-label="Footer">
        
          <a href="../../features/enable-logs/" title="Logs" class="md-footer-nav__link md-footer-nav__link--prev" rel="prev">
            <div class="md-footer-nav__button md-icon">
              <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
            </div>
            <div class="md-footer-nav__title">
              <div class="md-ellipsis">
                <span class="md-footer-nav__direction">
                  Previous
                </span>
                Logs
              </div>
            </div>
          </a>
        
        
          <a href="../../extend/oauth_connection/" title="OAuth Connections" class="md-footer-nav__link md-footer-nav__link--next" rel="next">
            <div class="md-footer-nav__title">
              <div class="md-ellipsis">
                <span class="md-footer-nav__direction">
                  Next
                </span>
                OAuth Connections
              </div>
            </div>
            <div class="md-footer-nav__button md-icon">
              <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4z"/></svg>
            </div>
          </a>
        
      </nav>
    </div>
  
  <div class="md-footer-meta md-typeset">
    <div class="md-footer-meta__inner md-grid">
      <div class="md-footer-copyright">
        
        Made with
        <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
          Material for MkDocs
        </a>
      </div>
      
    </div>
  </div>
</footer>
      
    </div>
    
      <script src="../../assets/javascripts/vendor.c3dc8c49.min.js"></script>
      <script src="../../assets/javascripts/bundle.f9edbbd5.min.js"></script><script id="__lang" type="application/json">{"clipboard.copy": "Copy to clipboard", "clipboard.copied": "Copied to clipboard", "search.config.lang": "en", "search.config.pipeline": "trimmer, stopWordFilter", "search.config.separator": "[\\s\\-]+", "search.result.placeholder": "Type to start searching", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents"}</script>
      
      <script>
        app = initialize({
          base: "../..",
          features: [],
          search: Object.assign({
            worker: "../../assets/javascripts/worker/search.8e2cddea.min.js"
          }, typeof search !== "undefined" && search)
        })
      </script>
      
    
  </body>
</html>